from flask_restful import Resource,reqparse
from flask import g,current_app
from comment.utils.decorators import login_required
from comment.models.user import User
from comment.models.letter import Letter,Letter_detail
from comment.models import db
from financial.resource.letter.serializer import LetterPaginateSerializer

class Letter_Res(Resource):
    '''
    发送消息的资源类
    '''
    #需要用户登录后才能操作
    method_decorators = [login_required]

    def post(self):
        '''
        发送消息
        :return:
        '''
        rp=reqparse.RequestParser()
        rp.add_argument('title',required=True)
        rp.add_argument('group')  #群发消息的时候，用户组，可以为空
        rp.add_argument('rec_id') #单个用户发送信息的时候，接收用户id，可以为空
        rp.add_argument('content',required=True)

        args=rp.parse_args()
        title=args.title
        group=args.group
        rec_id=args.rec_id
        content=args.content

        #todo 发送消息的用户id,当前用户 发送者
        uid=g.user_id
        user=User.query.filter(User.id==uid).first()

        #todo 第一种：群发消息，group有3个值：2：代表全体用户，0：代表普通用户组，1：代表管理员
        if group=='0' or group=='1':        #根据用户角色查询所有的接收用户
            rec_list=User.query.filter(User.role==int(group)).all()
        if group=='2':#群发消息给所有用户
            rec_list=User.query.all()

        #todo 第二种：单个用户发送消息
        if rec_id:
            rec_user=User.query.filter(User.id==rec_id).first()
            if rec_user:
                rec_list=[rec_user]

        #todo 把消息详对象插入到数据库中
        new_letter_detail=Letter_detail(title=title,detail=content)
        db.session.add(new_letter_detail)
        db.session.flush()      #todo commit:表示提交到数据库中，flush表示刷新到数据库的缓冲区（表中没有数据，但是有自增的id），为什么不用commit呢，做一次性提交

        for rec_user in rec_list:

            #todo 给每个用户发送消息
            letter=Letter(sendID=user.username,recID=rec_user.id,detail_id=new_letter_detail.id,state=0)
            db.session.add(letter)
        db.session.commit()
        return {'msg':'ok'}


    def get(self):
        '''
        查询当前用户收到的信息列表（分页）
        :return:
        '''
        uid = g.user_id     #当前登录的用户id
        user = User.query.filter(User.id == uid).first()

        rp = reqparse.RequestParser()
        rp.add_argument('curPage', required=True)  #todo 访问的页号，必填
        rp.add_argument('perPage', required=True)  # 每一页显示数据的条数  必填
        args = rp.parse_args()
        curPage = int(args.get('curPage'))
        perPage = int(args.get('perPage'))

        #todo letter_list:是Pagination类型。包含分页的数据，同时在items属性中包含消息列表数据
        letter_list=Letter.query.filter(Letter.recID==uid).paginate(curPage,perPage,error_out=False)
        #py对象先转化成字典
        dict_data=LetterPaginateSerializer(letter_list).to_dict()
        return {'msg':'ok','data':dict_data}


    def delete(self):
        '''
        删除信件
        :return:
        '''
        rp=reqparse.RequestParser()
        rp.add_argument('message_id',required=True)
        args=rp.parse_args()
        message_id=args.message_id

        letter_info=Letter.query.filter(Letter.id==message_id).first()
        if letter_info:
            db.session.delete(letter_info)
            db.session.commit()
            return {'msg':'ok'}
        else:
            return {'code':2001,'message':"没有该消息"}

    def update(self):
        '''
        更新信件
        :return:
        '''
        rp=reqparse.RequestParser()
        rp.add_argument('message_id',required=True)
        args=rp.parse_args()
        message_id=args.message_id

        letter_info=Letter.querry.filter(Letter.id==message_id).first()
        if letter_info:
            letter_info.state=1
            db.session.commit()
            return {'msg':'ok'}
        else:

            return {'message':'此消息不存在','code':20001}







